
#include <iostream>
#include <string>

using namespace std;

// demo1: ref and value
template <typename T>
int bigger_ref(const T &a, const T &b)
{
    return a > b;
}

template <typename T>
int bigger_value(const T a, const T b)
{
    return a > b;
}

int main()
{
    cout << bigger_ref(1, 2) << endl; // 0
    cout << bigger_ref(2, 0) << endl; // 1
    string s1 = "hello", s2 = "a world";
    cout << bigger_ref(s1, s2) << endl; // 1 参数类型为：str and str
    // cout << bigger_ref("zzbc", "bbc") << endl;      // error 因为形参是引用类型，无法内部实现数组到指针的转换。参数类型为: (const char [5], const char [4])
    cout << bigger_ref<string>("zzbc", "bbc") << endl; // 显式指定参数类型是string, 无须内部转换
    cout << bigger_value(s1, s2) << endl;              // 1
    cout << bigger_value("zzbc", "bbc") << endl;       // 1 因为形参是值类型，内部实现了数组到指针的转换
    return 0;

    // max
    // auto mx = max(1, 2.0);      // error
    auto mx = max<double>(1, 2.0); // ok
}